[IA64] fix usage of ia64_xen_vector
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Tue, 11 Jul 2006 18:53:04 +0000 (12:53 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Tue, 11 Jul 2006 18:53:04 +0000 (12:53 -0600)
Must look up the vector via the GSI to test if it's in use.

Signed-off-by: Alex Williamson <alex.williamson@hp.com>
xen/arch/ia64/linux-xen/iosapic.c

index 2be8374f2af206cc6aadf95f75507cd5e5e191a5..29a20c58df824e94c288a3ca4f1c809cecfd0427 100644 (file)
@@ -1155,7 +1155,7 @@ int iosapic_guest_read(unsigned long physbase, unsigned int reg, u32 *pval)
 
 int iosapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
 {
-       unsigned int id, gsi, vec, dest, high32;
+       unsigned int id, gsi, vec, xen_vec, dest, high32;
        char rte_index;
        struct iosapic *ios;
        struct iosapic_intr_info *info;
@@ -1185,13 +1185,17 @@ int iosapic_guest_write(unsigned long physbase, unsigned int reg, u32 val)
 
        /* Sanity check. Vector should be allocated before this update */
        if ((rte_index > ios->num_rte) ||
-           test_bit(vec, ia64_xen_vector) ||
            ((vec > IA64_FIRST_DEVICE_VECTOR) &&
             (vec < IA64_LAST_DEVICE_VECTOR) &&
             (!test_bit(vec - IA64_FIRST_DEVICE_VECTOR, ia64_vector_mask))))
            return -EINVAL;
 
        gsi = ios->gsi_base + rte_index;
+       xen_vec = gsi_to_vector(gsi);
+       if (xen_vec >= 0 && test_bit(xen_vec, ia64_xen_vector)) {
+               printk("WARN: GSI %d in use by Xen.\n", gsi);
+               return -EINVAL;
+       }
        info = &iosapic_intr_info[vec];
        spin_lock_irqsave(&irq_descp(vec)->lock, flags);
        spin_lock(&iosapic_lock);